home *** CD-ROM | disk | FTP | other *** search
/ Internet Info 1994 March / Internet Info CD-ROM (Walnut Creek) (March 1994).iso / networking / ip / ka9q / MNetsrc.hqx / Mac TCP_IP Source v.33 / trace.c < prev    next >
C/C++ Source or Header  |  1989-02-22  |  4KB  |  204 lines

  1. #include <stdio.h>
  2. #include <ctype.h>
  3. #include "global.h"
  4. #include "mbuf.h"
  5. #include "iface.h"
  6. #include "trace.h"
  7.  
  8. /* Redefined here so that programs calling dump in the library won't pull
  9.  * in the rest of the package
  10.  */
  11. static char nospace[] = "No space!!\n";
  12. #ifdef MAC
  13. extern int tcptrcflg;
  14. extern FILE *trcwndp;
  15. #endif
  16.  
  17. dump(interface,direction,type,bp)
  18. register struct interface *interface;
  19. int direction;
  20. unsigned type;
  21. struct mbuf *bp;
  22. {
  23.     struct mbuf *tbp;
  24.     void ascii_dump(),hex_dump();
  25.     int ax25_dump(),ether_dump(),ip_dump();
  26.     int (*func)();
  27.     int16 size;
  28.  
  29.     if((interface->trace & direction) == 0)
  30.         return;    /* Nothing to trace */
  31.  
  32.     switch(direction){
  33.     case IF_TRACE_IN:
  34. #ifdef MAC
  35.         fprintf(trcwndp,"%s recv:\n",interface->name);
  36. #else
  37.         printf("%s recv:\n",interface->name);
  38. #endif
  39.         break;
  40.     case IF_TRACE_OUT:
  41. #ifdef MAC
  42.         fprintf(trcwndp,"%s sent:\n",interface->name);
  43. #else
  44.         printf("%s sent:\n",interface->name);
  45. #endif
  46.         break;
  47.     }
  48.     if(bp == NULLBUF || (size = len_mbuf(bp)) == 0){
  49. #ifdef MAC
  50.         fprintf(trcwndp,"empty packet!!\n");
  51.         fflush(trcwndp);
  52. #else
  53.         printf("empty packet!!\n");
  54.         fflush(stdout);
  55. #endif
  56.         return;
  57.     }
  58.  
  59.     if(type < NTRACE)
  60.         func = tracef[type];
  61.     else
  62.         func = NULLFP;
  63.  
  64.     dup_p(&tbp,bp,0,size);
  65.     if(tbp == NULLBUF){
  66. #ifdef MAC
  67.         fprintf(trcwndp,nospace);
  68.         fflush(trcwndp);
  69. #else
  70.         printf(nospace);
  71.         fflush(stdout);
  72. #endif
  73.         return;
  74.     }
  75.     if(func != NULLFP)
  76.         (*func)(&tbp,1);
  77.     if(interface->trace & IF_TRACE_ASCII){
  78.         /* Dump only data portion of packet in ascii */
  79.         ascii_dump(&tbp);
  80.     } else if(interface->trace & IF_TRACE_HEX){
  81.         /* Dump entire packet in hex/ascii */
  82.         free_p(tbp);
  83.         dup_p(&tbp,bp,0,len_mbuf(bp));
  84.         if(tbp != NULLBUF)
  85.             hex_dump(&tbp);
  86.         else
  87. #ifdef MAC
  88.         fprintf(trcwndp,nospace);
  89. #else
  90.             printf(nospace);
  91. #endif
  92.     }
  93.     free_p(tbp);
  94. #ifdef MAC
  95.         fflush(trcwndp);
  96. #else
  97.     fflush(stdout);
  98. #endif
  99. }
  100.  
  101. /* Dump an mbuf in hex */
  102. void
  103. hex_dump(bpp)
  104. register struct mbuf **bpp;
  105. {
  106.     int16 n;
  107.     int16 address;
  108.     void fmtline();
  109.     char buf[16];
  110.  
  111.     if(bpp == NULLBUFP || *bpp == NULLBUF)
  112.         return;
  113.  
  114.     address = 0;
  115.     while((n = pullup(bpp,buf,sizeof(buf))) != 0){
  116.         fmtline(address,buf,n);
  117.         address += n;
  118.     }
  119. }
  120. /* Dump an mbuf in ascii */
  121. void
  122. ascii_dump(bpp)
  123. register struct mbuf **bpp;
  124. {
  125.     char c;
  126.     register int16 tot;
  127.  
  128.     if(bpp == NULLBUFP || *bpp == NULLBUF)
  129.         return;
  130.  
  131.     tot = 0;
  132.     while(pullup(bpp,&c,1) == 1){
  133.         if((tot % 64) == 0)
  134. #ifdef MAC
  135.         fprintf(trcwndp,"%04x  ",tot);
  136.         fputc(isprint(c) ? c : '.',trcwndp);
  137. #else
  138.             printf("%04x  ",tot);
  139.         putchar(isprint(c) ? c : '.');
  140. #endif
  141.         if((++tot % 64) == 0)
  142. #ifdef MAC
  143.             fprintf(trcwndp,"\n");
  144. #else
  145.             printf("\n");
  146. #endif
  147.     }
  148.     if((tot % 64) != 0)
  149. #ifdef MAC
  150.         fprintf(trcwndp,"\n");
  151. #else
  152.         printf("\n");
  153. #endif
  154. }
  155. /* Print a buffer up to 16 bytes long in formatted hex with ascii
  156.  * translation, e.g.,
  157.  * 0000: 30 31 32 33 34 35 36 37 38 39 3a 3b 3c 3d 3e 3f  0123456789:;<=>?
  158.  */
  159. void
  160. fmtline(addr,buf,len)
  161. int16 addr;
  162. char *buf;
  163. int16 len;
  164. {
  165.     char line[80];
  166.     register char *aptr,*cptr;
  167.     register char c;
  168.     void ctohex();
  169.  
  170.     memset(line,' ',sizeof(line));
  171.     ctohex(line,hibyte(addr));
  172.     ctohex(line+2,lobyte(addr));
  173.     aptr = &line[6];
  174.     cptr = &line[55];
  175.     while(len-- != 0){
  176.         c = *buf++;
  177.         ctohex(aptr,(int16)uchar(c));
  178.         aptr += 3;
  179.         c &= 0x7f;
  180.         *cptr++ = isprint(c) ? c : '.';
  181.     }
  182.     *cptr++ = '\r';
  183.     *cptr++ = '\n';
  184. #ifdef MAC
  185.     fwrite(line,1,(unsigned)(cptr-line),trcwndp);
  186. #else
  187.     fwrite(line,1,(unsigned)(cptr-line),stdout);
  188. #endif
  189. }
  190. /* Convert byte to two ascii-hex characters */
  191. static
  192. void
  193. ctohex(buf,c)
  194. register char *buf;
  195. register int16 c;
  196. {
  197.     static char hex[] = "0123456789abcdef";
  198.  
  199.     *buf++ = hex[hinibble(c)];
  200.     *buf = hex[lonibble(c)];
  201. }
  202.  
  203.  
  204.